package com.wyr.leetcode.step1.string;

import java.util.*;

public class IsIsomorphic {
    /**
     * 205. 同构字符串
     * 给定两个字符串 s 和 t ，判断它们是否是同构的。
     *
     * 如果 s 中的字符可以按某种映射关系替换得到 t ，那么这两个字符串是同构的。
     *
     * 每个出现的字符都应当映射到另一个字符，同时不改变字符的顺序。不同字符不能映射到同一个字符上，相同字符只能映射到同一个字符上，字符可以映射到自己本身。
     *
     * https://leetcode.cn/problems/isomorphic-strings/description/
     */

    public static boolean isIsomorphic(String s, String t) {
        if(s.length() != t.length()){
            return false;
        }
        LinkedHashMap<Character, List<Integer>> map1 = new LinkedHashMap<>();
        LinkedHashMap<Character, List<Integer>> map2 = new LinkedHashMap<>();
        for(int i=0;i<s.length();i++){
            if(!map1.containsKey(s.charAt(i))){
                map1.put(s.charAt(i),new ArrayList<>());
            }
            map1.get(s.charAt(i)).add(i);

            if(!map2.containsKey(t.charAt(i))){
                map2.put(t.charAt(i),new ArrayList<>());
            }
            map2.get(t.charAt(i)).add(i);
        }
        if(map1.size() != map2.size()){
            return false;
        }else{
            Collection<List<Integer>> values1 = map1.values();
            Collection<List<Integer>> values2 = map2.values();
            List<Integer> re1 = values1.stream().reduce(new ArrayList<>(), (integers, integers2) -> {
                integers.addAll(integers2);
                return integers;
            });
            List<Integer> re2 = values2.stream().reduce(new ArrayList<>(), (integers, integers2) -> {
                integers.addAll(integers2);
                return integers;
            });
            return re1.equals(re2);
        }
    }

    public static void main(String[] args) {
        isIsomorphic("egg","add");
    }
}
